/**************************** (C) COPYRIGHT 2018 Fortiortech shenzhen *****************************
 * File Name          : AddFunction.h
 * Author             : Bruce, Fortiortech Hardware
 * Version            : V1.0
 * Date               : 2018-02-11
 * Description        : This file contains all the common data types used for
 *                      Motor Control.
 ***************************************************************************************************
 * All Rights Reserved
 **************************************************************************************************/

#ifndef __AddFunction_H_
#define __AddFunction_H_

typedef struct
{
    uint8 OverCurCnt; // 软件过流计数

    uint16 Abs_ia; // IA的绝对值
    uint16 Abs_ib; // IB的绝对值
    uint16 Abs_ic; // IC的绝对值

    uint16 Max_ia; // IA的最大值
    uint16 Max_ib; // IB的最大值
    uint16 Max_ic; // IC的最大值
} CurrentVarible;

typedef struct
{
    uint8 SecondStartTimes;    // 二次启动保护的次数
    uint8 StallTimes;          // 堵转保护次数
    uint8 LossPHTimes;         // 缺相保护次数
    uint8 CurrentPretectTimes; // 过流保护次数

    uint8 over_VoltageTimes;  // 缺相保护次数
    uint8 under_VoltageTimes; // 过流保护次数

    uint8 StartFlag; // 启动保护的标志位，用于判断哪个方法起作用
    uint8 StallFlag; // 堵转保护的标志位，用于判断哪个方法起作用
} ProtectVarible;
typedef struct
{
    uint8 segment;            // 分段执行
    uint8 OverVoltDetecCnt;   // 过压检测计数
    uint8 UnderVoltDetecCnt;  // 欠压检测计数
    uint8 VoltRecoverCnt;     // 过压恢复计数
    uint16 CurrentRecoverCnt; // 过流保护恢复计数

    uint8 StallDectEs;    // method 1，与ES相关
    uint8 StallDectSpeed; // method 2，与速度相关
    uint16 StallReCount;  // 堵转保护恢复计数

    uint8 Lphasecnt; // 缺相保护计时
    uint8 Lpha3secnt;
    uint8 AOpencnt;          // A缺相计数
    uint8 BOpencnt;          // B缺相计数
    uint8 COpencnt;          // C缺相计数
    uint16 mcLossPHRecCount; // 缺相恢复计数

    int16 StartSpeedCnt; // 启动保护判断速度和ES的计时

} FaultVarible;

typedef enum
{
    FaultNoSource = 0,      // 无故障
    FaultHardOVCurrent = 1, // 硬件过流
    FaultSoftOVCurrent = 2, // 软件过流
    FaultUnderVoltage = 3,  // 欠压保护
    FaultOverVoltage = 4,   // 过压保护
    FaultLossPhase = 5,     // 缺相保护
    FaultStall = 6,         // 堵转保护
    FaultStart = 7,         // 启动保护
    FaultOverwind = 8,      // 顺逆风失败保护
} FaultStateType;

typedef struct
{
    uint16 ADCDcbus; // 母线电压
    uint16 ADCVref;  // ADC参考
} ADCSample;

typedef struct
{
    uint8  PIControlPeriod;                             // PI执行周期
    uint16 PIRunDelayTimeCount;                         // PI环运行延时计数
    uint16 Close_loop_delay_time;                       // PI闭环延时数值
    uint16 TorqueLoopTime;                              // 转矩环时间

} OUTLoopPI;

typedef struct
{
    uint16 mcDcbusFlt;                                 // 母线电压
    uint16 mcDcbusFlt_LSB;                             // 当前母线电压滤波后的值
    uint16 CtrlMode;                                   // 控制模式
    uint16 CurrentPower;                               // 当前功率
    uint16 Powerlpf;                                   // 功率滤波后的值
    uint16 Powerlpf_LSB;                               // 功率滤波后的值
    int16  mcIqref;                                    // Q轴给定电流
    int16  McuRef;
    uint16 mcPosCheckAngle;                            // 位置检测的角度
//    int32  SQUSysSpeed;                                // 速度的平方和
    int16  SpeedFlt;                                   // 当前速度滤波后的值
    uint16 SpeedFlt_LSB;                              // 当前速度滤波后的值
    int16  SpeedFlag;
    uint16 EsValue;                                    // 当前FOC_ESQU滤波后的值
    uint16 SQUSpeedDIVEs;                              // 速度平方和除以ESQU的值
    uint16 Smo_EK2;                                    // EK2的调试值
    uint16 EsValue_LSB;                                // 当前FOC_ESQU滤波后的值
    uint8  Uqdelaycnt;
    uint8  ESDIVFlag;                                  // 除法执行标志位
    uint16 SpeedLoopTime;                              // 速度环时间
    uint16 RunStateCnt;                                // 运行状态计数
    uint16 PowerLoopTime;                              // 功率环时间
    uint16 TorqueLoopTime;                             // 转矩环时间
//    uint16 RunCurrent;                                 // 运行电流
    uint8 ChargeStep;                                 // 预充电的步骤
    uint16 State_Count;                                // 电机各个状态的时间计数
		
	OUTLoopPI OUTLoopCtrl;
}FOCCTRL;
typedef struct
{
    int16 TargetValue;
    int16 ActualValue;
    int16 DelayCount;
    int16 DelayPeriod;
    int8 FlagONOFF;
} MCRAMP;

typedef struct
{
    uint8 FR;     // 当前给定的转子方向
    uint8 FlagFR; // 反向的标志位
    uint8 TargetFR; // 设置的目标方向
    uint16 OldTargetSpeed;
} MotorFRTypeDef;

/* Exported variables ---------------------------------------------------------------------------*/
extern FaultVarible idata mcFaultDect;
extern CurrentVarible idata mcCurVarible;
extern ProtectVarible idata mcProtectTime;
extern FaultStateType xdata mcFaultSource;
extern ADCSample xdata AdcSampleValue;
extern FOCCTRL xdata mcFocCtrl;
extern MCRAMP xdata mcSpeedRamp;

extern MotorFRTypeDef xdata mcFRState;
extern uint16 Break_delay_time;

/* Exported functions ---------------------------------------------------------------------------*/
extern void Fault_Overcurrent(CurrentVarible *h_Cur);
extern void Fault_Detection(void);
extern void Speed_response(void);
extern void FaultProcess(void);
extern void StarRampDealwith(void);
extern void CurrentZeroDetect(void);
extern void Fault_Buzzer(void);
#endif